package br.com.games.pyx.mosaico;

import java.util.HashMap;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.anddev.andengine.entity.sprite.TiledSprite;
import org.anddev.andengine.opengl.texture.Texture;
import org.anddev.andengine.opengl.texture.region.TextureRegion;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.content.Context;
import android.util.Log;
import br.com.games.pyx.singleton.FabricaRecursos;

public class CarregadorMosaico {

	private Mosaico mosaico;
	private String nome;
	private HashMap<String, Parte> parts = new HashMap<String, Parte>();
	private String base;
	private int comprimentoCelulas;
	private int alturaCelulas;
	private Texture texture;
	
//	imagens.getTiles().get("l_"+parte.linha+"c_"+parte.coluna)
	
	public Mosaico carregarMosaico(String nome, Context context) {

		mosaico = null;
		this.nome = nome;
		
		SAXParser parser;
		try {
			parser = SAXParserFactory.newInstance().newSAXParser();
			String caminho = "mosaicos/" + nome + ".def";

			CarregadorXMLHandler handler = new CarregadorXMLHandler();

			parser.parse(context.getAssets().open(caminho), handler);

			return mosaico;

		} catch (Throwable e) {
			Log.e("Toupety", "ERROR", e);
		}
		
		return null;
	}

	class CarregadorXMLHandler extends DefaultHandler {

		@Override
		public void startElement(String uri, String localName, String tag,
				Attributes attributes) throws SAXException {

			if (tag.toUpperCase().equals("MOSAICO")) {
				
				base = attributes.getValue("base");
				comprimentoCelulas = Integer.parseInt(attributes.getValue("comprimentoCelulas"));
				alturaCelulas = Integer.parseInt(attributes.getValue("alturaCelulas"));
				int linhas = Integer.parseInt(attributes.getValue("linhas"));
				int colunas = Integer.parseInt(attributes.getValue("colunas"));
				
				try {
					mosaico = new Mosaico(nome, linhas, colunas, comprimentoCelulas, alturaCelulas);
					
					texture = FabricaRecursos.get().getTexture("imagens/"+base);
					
				} catch (Exception e) {
					e.printStackTrace();
				}

			} else if (tag.toUpperCase().equals("CELULA")) {
				
				String nome = attributes.getValue("nome");
				int linha = Integer.parseInt(attributes.getValue("linhaDestino"));
				int coluna = Integer.parseInt(attributes.getValue("colunaDestino"));
				int parteLinha = Integer.parseInt(attributes.getValue("parteLinha"));
				int parteColuna = Integer.parseInt(attributes.getValue("parteColuna"));

				try {
					Parte p = parts.get("l_"+parteLinha+"c_"+parteColuna);
					
					if(p == null) {
						p = new Parte();
						
						p.nome = nome;
						p.linha = parteLinha;
						p.coluna = parteColuna;
						
						final int texturePositionX = comprimentoCelulas * parteColuna;
						final int texturePositionY = alturaCelulas * parteLinha;						
						
						p.tile = new TextureRegion(texture, texturePositionX, texturePositionY, comprimentoCelulas, alturaCelulas);
						
						parts.put("l_"+parteLinha+"c_"+parteColuna, p);
					}
					
					mosaico.addCelula(p, linha, coluna);

				} catch(Throwable e) {
					e.printStackTrace();
				}
			}
		}
		
		
		private int toPowerTwo(int v) {
			int ret = 0;
			
			if(v <= 32) {
				ret = 32;
			} else if(v <= 64) {
				ret = 64;
			} else if(v <= 128) {
				ret = 128;
			} else if(v <= 256) {
				ret = 256;
			} else if(v <= 512) {
				ret = 512;
			}
			
			return ret;
		}
		
		private boolean paraBoolean(String val) {
			if (val == null)
				return false;

			return val.equalsIgnoreCase("SIM") ? true : false;
		}

		@Override
		public void endElement(String uri, String localName, String tag)
				throws SAXException {
		}

	}
}
